:#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){

    pid_t id = fork();          // 创建子进程
    if(id < 0){
        perror("fork");
        exit(1);
    }
    else if(id == 0){           // 子进程
        int cnt = 5;
        while(cnt){
            printf("我是子进程：%d\n", cnt--);
            sleep(1);
        }
        exit(11);               // 仅用于测试！
    }else{                      // 父进程
        /* 非阻塞等待 */
        int quit = 0;
        while(!quit){
            int status = 0;
            pid_t res = waitpid(-1, &status, WNOHANG);      // 设置以非阻塞方式等待
            if(res > 0){
                // 等待成功 && 子进程退出
                printf("等待子进程退出成功，退出码：%d\n",WEXITSTATUS(status));
            }else if(res == 0){
                // 等待成功 && 子进程并未退出！
                printf("子进程人在运行当中！暂时还未退出！\n");
            }else{
                // 等待失败！
                printf("wait() 失败！\n");
            }
        }

        /* 阻塞等待 */
#if 0
        // 就目前而言，子进程退出的时候，父进程才会waitpid函数，进行返回！（即父进程依旧存活！）
       // waitpid/wait 可以在目前情况下，让进程退出具有一定的有序性
       // 将来可以让父进程进行更多收尾工作！
        int status = 0;
        // id > 0：等待指定进程退出！
        // id == -1：等待任意子进程退出，相当于 wait();
        pid_t ret = waitpid(id, &status, 0); // 0：默认在阻塞状态下等待子进程状态变化（即等待子进程退出！）
        if(ret > 0){
            //printf("等待子进程成功! 退出码：status：%d; 退出信号：%d\n",ret,(status>>8)&0xFF, status&0x7F);
            if(WIFEXITED(status)){
                // 子进程正常退出！
                printf("子进程执行完毕！子进程退出码：%d\n", WEXITSTATUS(status));
            }else{
                printf("子进程异常退出：%d\n",WIFEXITED(status));
            }
        }
#endif
    }

    return 0;
}
